﻿using System;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;

namespace Slex.Lib.Interactions
{
    /// <summary>
    /// A base class for inheriting event based triggers
    /// </summary>
    public abstract class EventBasedTrigger : SlexTrigger
    {


        /// <summary>
        /// The sender of this trigger
        /// </summary>
        public object Sender
        {
            get { return (object)GetValue(SenderProperty); }
            set { SetValue(SenderProperty, value); }
        }

        // Using a DependencyProperty as the backing store for Sender.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty SenderProperty =
            DependencyProperty.Register("Sender", typeof(object), typeof(EventBasedTrigger), new PropertyMetadata(null));


        /// <summary>
        /// The argument parameter
        /// </summary>
        public object Argument
        {
            get { return (object)GetValue(ArgumentProperty); }
            set { SetValue(ArgumentProperty, value); }
        }

        // Using a DependencyProperty as the backing store for Argument.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty ArgumentProperty =
            DependencyProperty.Register("Argument", typeof(object), typeof(EventBasedTrigger), new PropertyMetadata(null));

        

        protected override void InvokeConditional(object parameter)
        {
            object val = parameter;

            if (parameter is EventResult)
            {
                var result = parameter as EventResult;
                this.Sender = result.Sender;
                this.Argument = result.Args;

                if (result.Args is DependencyPropertyChangedEventArgs)
                {
                    val = ((DependencyPropertyChangedEventArgs)result.Args).NewValue;
                }
            }

            base.InvokeConditional(val);
        }
    }
}
